package com.yzf.demo.demo.Thread;

/**
 * Created by 于占峰 on 2020/3/31/031.
 * ##### 1.synchronized 的作用
 * ###### 	可以解决可见性、原子性 、有序性问题;
 * ##### 2.synchronized 锁的范围
 * ###### 	对于普通同步方法.锁是当前实例对象;
 * ###### 	对于静态同步方法,锁是当前类的Class对象;
 * ###### 	对于同步方法快,锁是synchronized 括号里配置的对象
 */
public class SynchronizedDemo {

    //方法修饰 对象锁 同一个对象有有效
    public synchronized void demo() {

    }

    /**
     * 代码块的好处  只包裹当前存在线程安全问题的代码 括号内指定要锁定的对象或class类
     * 只对括号内的代码有效 也可以实现对象锁 和 类级别的锁
     */
    public void demoMethod() {
        synchronized (this) {

        }
    }

    //锁的是class类
    public void demoMethod2() {
        synchronized (SynchronizedDemo.class) {

        }
    }

    //静态方法锁 类级别的锁
    public synchronized static void syncDemo() {

    }

    public static void main(String[] args) {
        //对象锁只在同一对象下有效 ,下面代码因为调用的是两个对象,因此锁无效
        SynchronizedDemo syncDemo = new SynchronizedDemo();
        SynchronizedDemo syncDemo2 = new SynchronizedDemo();
        new Thread(() -> {
            syncDemo.demo();
        }).start();
        new Thread(() -> {
            syncDemo2.demo();
        }).start();

        //静态方法锁 synchronized修饰的静态方法 锁住的是类 下段代码锁有效
        new Thread(() -> {
            syncDemo.syncDemo();
        }).start();
        new Thread(() -> {
            syncDemo2.syncDemo();
        }).start();


    }
}
